package jmine.tec.rpc.common.provider;

import jmine.tec.rpc.common.annotation.RestDefinition;
import jmine.tec.rpc.common.entity.EntityRepresentation;
import jmine.tec.rpc.common.entity.EntityRest;

/**
 * Serviço REST que provê informações sobre a disponibilidade de outros serviços.
 * 
 * @author lundberg
 */
@RestDefinition
public interface RestServiceDiscovery {

    /**
     * Busca informações sobre o serviço que provê acesso à representação
     * 
     * @param <R> tipo de representação
     * @param representation representation
     * @return ServiceInfo
     * @throws ServiceUnavailableException ServiceUnavailableException
     */
    <R extends EntityRepresentation> ServiceInfo<? extends EntityRest<R>> getRepresentationServiceInfo(Class<R> representation)
            throws ServiceUnavailableException;

    /**
     * Busca informações sobre o serviço
     * 
     * @param <S> tipo de serviço
     * @param service service
     * @return ServiceInfo
     * @throws ServiceUnavailableException ServiceUnavailableException
     */
    <S> ServiceInfo<S> getServiceInfo(Class<S> service) throws ServiceUnavailableException;
}
